home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / pdftops / xpdf / c++ / Page < prev    next >
Text File  |  1996-06-08  |  6KB  |  250 lines

  1. //========================================================================
  2. //
  3. // Page.cc
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. //#pragma implementation
  11. #endif
  12.  
  13. #include <stddef.h>
  14. #include "Object.h"
  15. #include "Array.h"
  16. #include "Dict.h"
  17. #include "XRef.h"
  18. #include "OutputDev.h"
  19. #include "PSOutput.h"
  20. #include "Gfx.h"
  21. #include "Error.h"
  22. #include "Flags.h"
  23. #include "Page.h"
  24.  
  25. //------------------------------------------------------------------------
  26. // PageAttrs
  27. //------------------------------------------------------------------------
  28.  
  29. PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
  30.   Object obj1, obj2;
  31.  
  32.   // get old/default values
  33.   if (attrs) {
  34.     x1 = attrs->x1;
  35.     y1 = attrs->y1;
  36.     x2 = attrs->x2;
  37.     y2 = attrs->y2;
  38.     rotate = attrs->rotate;
  39.   } else {
  40.     // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
  41.     // but some (non-compliant) PDF files don't specify a MediaBox
  42.     x1 = 0;
  43.     y1 = 0;
  44.     x2 = 612;
  45.     y2 = 792;
  46.     rotate = 0;
  47.   }
  48.  
  49.   // media box
  50.   dict->lookup("MediaBox", &obj1);
  51.   if (obj1.isArray() && obj1.arrayGetLength() == 4) {
  52.     obj1.arrayGet(0, &obj2);
  53.     if (obj2.isInt())
  54.       x1 = obj2.getInt();
  55.     obj2.free();
  56.     obj1.arrayGet(1, &obj2);
  57.     if (obj2.isInt())
  58.       y1 = obj2.getInt();
  59.     obj2.free();
  60.     obj1.arrayGet(2, &obj2);
  61.     if (obj2.isInt())
  62.       x2 = obj2.getInt();
  63.     obj2.free();
  64.     obj1.arrayGet(3, &obj2);
  65.     if (obj2.isInt())
  66.       y2 = obj2.getInt();
  67.     obj2.free();
  68.   }
  69.   obj1.free();
  70.  
  71.   // rotate
  72.   dict->lookup("Rotate", &obj1);
  73.   if (obj1.isInt())
  74.     rotate = obj1.getInt();
  75.   obj1.free();
  76. }
  77.  
  78. //------------------------------------------------------------------------
  79. // Page
  80. //------------------------------------------------------------------------
  81.  
  82. Page::Page(int num1, Dict *pageDict, PageAttrs *attrs1) {
  83.   Object resourceDict;
  84.  
  85.   ok = gTrue;
  86.   num = num1;
  87.  
  88.   // get attributes
  89.   attrs = attrs1;
  90.  
  91.   // resources
  92.   pageDict->lookup("Resources", &resourceDict);
  93.   if (resourceDict.isDict()) {
  94.     resourceDict.dictLookup("Font", &fontDict);
  95.     if (!(fontDict.isDict() || fontDict.isNull())) {
  96.       error(0, "Font resources object (page %d) is wrong type (%s)",
  97.         num, fontDict.getTypeName());
  98.       goto err4;
  99.     }
  100.     resourceDict.dictLookup("XObject", &xObjDict);
  101.     if (!(xObjDict.isDict() || xObjDict.isNull())) {
  102.       error(0, "XObject resources object (page %d) is wrong type (%s)",
  103.         num, xObjDict.getTypeName());
  104.       goto err3;
  105.     }
  106.   } else if (resourceDict.isNull()) {
  107.     fontDict.initNull();
  108.     xObjDict.initNull();
  109.   } else {
  110.     error(0, "Resources object (page %d) is wrong type (%s)",
  111.       num, resourceDict.getTypeName());
  112.     goto err5;
  113.   }
  114.   resourceDict.free();
  115.  
  116.   // annotations
  117.   pageDict->lookupNF("Annots", &annots);
  118.   if (!(annots.isRef() || annots.isArray() || annots.isNull())) {
  119.     error(0, "Page annotations object (page %d) is wrong type (%s)",
  120.       num, annots.getTypeName());
  121.     goto err2;
  122.   }
  123.  
  124.   // contents
  125.   pageDict->lookupNF("Contents", &contents);
  126.   if (!(contents.isRef() || contents.isArray() ||
  127.     contents.isNull())) {
  128.     error(0, "Page contents object (page %d) is wrong type (%s)",
  129.       num, contents.getTypeName());
  130.     goto err1;
  131.   }
  132.  
  133.   return;
  134.  
  135.  err5:
  136.   fontDict.initNull();
  137.  err4:
  138.   xObjDict.initNull();
  139.  err3:
  140.   resourceDict.free();
  141.   annots.initNull();
  142.  err2:
  143.   contents.initNull();
  144.  err1:
  145.   ok = gFalse;
  146. }
  147.  
  148. Page::~Page() {
  149.   delete attrs;
  150.   fontDict.free();
  151.   xObjDict.free();
  152.   annots.free();
  153.   contents.free();
  154. }
  155.  
  156. void Page::display(OutputDev *out, int dpi, int rotate) {
  157.   Gfx *gfx;
  158.   Dict *fonts;
  159.   Dict *xObjects;
  160.   Object obj1, obj2;
  161.   int i;
  162.  
  163.   if (printCommands) {
  164.     printf("***** MediaBox = ll:%d,%d ur:%d,%d\n",
  165.        attrs->getX1(), attrs->getY1(), attrs->getX2(), attrs->getY2());
  166.     printf("***** Rotate = %d\n", attrs->getRotate());
  167.   }
  168.   if (fontDict.isDict())
  169.     fonts = fontDict.getDict();
  170.   else
  171.     fonts = NULL;
  172.   if (xObjDict.isDict())
  173.     xObjects = xObjDict.getDict();
  174.   else
  175.     xObjects = NULL;
  176.   rotate += attrs->getRotate();
  177.   if (rotate >= 360)
  178.     rotate -= 360;
  179.   else if (rotate < 0)
  180.     rotate += 360;
  181.   gfx = new Gfx(out, fonts, xObjects, dpi, attrs->getX1(), attrs->getY1(),
  182.         attrs->getX2(), attrs->getY2(), rotate);
  183.   contents.fetch(&obj1);
  184.   if (obj1.isArray()) {
  185.     for (i = 0; i < obj1.arrayGetLength(); ++i) {
  186.       obj1.arrayGet(i, &obj2);
  187.       if (obj2.isStream())
  188.     gfx->display(obj2.getStream());
  189.       else
  190.     error(0, "Weird page contents");
  191.       obj2.free();
  192.     }
  193.   } else if (obj1.isStream()) {
  194.     gfx->display(obj1.getStream());
  195.   } else {
  196.     error(0, "Weird page contents");
  197.   }
  198.   obj1.free();
  199.   delete gfx;
  200. }
  201.  
  202. void Page::genPostScript(PSOutput *psOut, int dpi, int rotate) {
  203.   Gfx *gfx;
  204.   Dict *fonts;
  205.   Dict *xObjects;
  206.   Object obj1, obj2;
  207.   int i;
  208.  
  209.   if (printCommands) {
  210.     printf("***** MediaBox = ll:%d,%d ur:%d,%d\n",
  211.        attrs->getX1(), attrs->getY1(), attrs->getX2(), attrs->getY2());
  212.     printf("***** Rotate = %d\n", attrs->getRotate());
  213.   }
  214.   psOut->startPage(num, attrs->getX1(), attrs->getY1(),
  215.            attrs->getX2(), attrs->getY2());
  216.   if (fontDict.isDict())
  217.     fonts = fontDict.getDict();
  218.   else
  219.     fonts = NULL;
  220.   if (xObjDict.isDict())
  221.     xObjects = xObjDict.getDict();
  222.   else
  223.     xObjects = NULL;
  224.   rotate += attrs->getRotate();
  225.   if (rotate >= 360)
  226.     rotate -= 360;
  227.   else if (rotate < 0)
  228.     rotate += 360;
  229.   gfx = new Gfx(psOut, fonts, xObjects, dpi, attrs->getX1(),
  230.         attrs->getY1(), attrs->getX2(), attrs->getY2(), rotate);
  231.   contents.fetch(&obj1);
  232.   if (obj1.isArray()) {
  233.     for (i = 0; i < obj1.arrayGetLength(); ++i) {
  234.       obj1.arrayGet(i, &obj2);
  235.       if (obj2.isStream())
  236.     gfx->display(obj2.getStream());
  237.       else
  238.     error(0, "Weird page contents");
  239.       obj2.free();
  240.     }
  241.   } else if (obj1.isStream()) {
  242.     gfx->display(obj1.getStream());
  243.   } else {
  244.     error(0, "Weird page contents");
  245.   }
  246.   obj1.free();
  247.   delete gfx;
  248.   psOut->endPage();
  249. }
  250.